package controllers

import (
	"goseckill/common"
	"goseckill/models"
	"goseckill/service"
	"strconv"

	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/mvc"
)

type ProductController struct {
	// 上下文
	Ctx iris.Context  
	// 服务
	ProductService service.IProductService
}

// TODO 抽象出BaseController（接口）也是一种思路

// /product/all
func (p *ProductController) GetAll() mvc.View {
	productArr,_ := p.ProductService.GetAllProduct()
	return mvc.View{
		// Name 指定对应的页面
		Name: "/product/allProducts.html",
		Data: iris.Map{
			"productArr":productArr,
		},
	}
}

// 修改商品 根据Restful规则 Post Update
func (p *ProductController) PostUpdate() {
	// 获取上下文的信息
	product := models.Product{}
	// 解析上下文 中的请求
	p.Ctx.Request().ParseForm()  
	// 解码
	decoder := common.NewDecoder(&common.DecoderOptions{TagName: "form"})
	if err:=decoder.Decode(p.Ctx.Request().Form, product);err!=nil {
		// 上下文中的iris示例
		// p.Ctx.Application()
		p.Ctx.Application().Logger().Debug(err)  // 日志
	}
	// 更新数据库
	err := p.ProductService.UpdateProduct(&product)
	if err!=nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	// 重定向  新的url
	p.Ctx.Redirect("/product/all")
}


// GetAdd : 跳转到添加商品
func (p *ProductController) GetAdd() mvc.View {
	// 直接跳转
	return mvc.View{
		Name: "product/addProduct.html",
	}
}
// 处理加入的商品，对服务器发现请求
func (p *ProductController) PostAdd() {
	// 首先，根据表单数据，建立对象实例
	product := &models.Product{}
	// 解析表单数据
	p.Ctx.Request().ParseForm() 
	decoder := common.NewDecoder(&common.DecoderOptions{TagName: "form"})
	// 解码
	if err:=decoder.Decode(p.Ctx.Request().Form, product);err!=nil {
		// 错误
		// 上下文中的iris示例
		// p.Ctx.Application()
		p.Ctx.Application().Logger().Debug(err)
	}
	// 更新数据库
	if _,err := p.ProductService.InsertProduct(product);err!=nil{
		// 错误
		// 上下文中的iris示例
		// p.Ctx.Application()
		p.Ctx.Application().Logger().Debug(err)
	}
	// 重定向 新的url
	p.Ctx.Redirect("/product/all")
}

// 拿到商品信息
func (p *ProductController) GetProductInfo() mvc.View {
	// 处理Get请求，上面的GetAll是商品总览，这里是商品详情
	idString := p.Ctx.URLParam("id") // 拿到url中的id参数
	// string 转int
	// base-10 进制    bitSize-16   16位
	id,err := strconv.ParseInt(idString, 10, 16)
	if err!=nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	// 根据id 到数据库查信息
	product,err := p.ProductService.GetProductByID(id)
	if err!=nil {
		p.Ctx.Application().Logger().Debug(err)
	}
	// 返回
	return mvc.View{
		Name: "product/profuctInfo.html",
		Data: iris.Map{
			"product":product,
		},
	}
}

// 删除信息
func (p *ProductController)  Delete() {
	// 解析表单数据
	idString := p.Ctx.URLParam("id")
	id,err := strconv.ParseInt(idString,10,16)
	if err!=nil{
		p.Ctx.Application().Logger().Debug(err)
	}

	if isOk := p.ProductService.DeleteProductByID(id);isOk{
		p.Ctx.Application().Logger().Debug("Delete product success, ID:" + idString)
	}else{
		p.Ctx.Application().Logger().Debug("Delete product error, ID:"+idString)
	}
	p.Ctx.Redirect("/product/all")
}